home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / gui / gtlayout.lha / Source / LTP_LayoutGadgets.c < prev    next >
C/C++ Source or Header  |  1999-01-03  |  31KB  |  1,157 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1999 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #include "Assert.h"
  15.  
  16. #ifdef DO_BOOPSI_KIND    /* Support code */
  17.  
  18. /*****************************************************************************/
  19.  
  20. #include <dos/dosextens.h>
  21.  
  22. /*****************************************************************************/
  23.  
  24. STATIC VOID
  25. LocalAddPart(STRPTR Base,STRPTR Name)
  26. {
  27.     LONG Len = strlen(Base);
  28.  
  29.     if(Base[Len - 1] != ':')
  30.         strcat(Base,"/");
  31.  
  32.     strcat(Base,Name);
  33. }
  34.  
  35. STATIC struct Library *
  36. OpenClass(STRPTR Name)
  37. {
  38.     struct Library *Result;
  39.  
  40.     Result = OpenLibrary(Name,0);
  41.     if(Result == NULL)
  42.     {
  43.         struct Process *    Process = (struct Process *)FindTask(NULL);
  44.         UBYTE                LocalBuffer[256];
  45.         LONG                i,Len;
  46.  
  47.         Len = strlen(Name);
  48.  
  49.         for(i = Len - 1 ; i >= 0 ; i--)
  50.         {
  51.             if(Name[i] == '/' || Name[i] == ':')
  52.             {
  53.                 Name = &Name[i + 1];
  54.  
  55.                 break;
  56.             }
  57.         }
  58.  
  59.         if(Process->pr_Task.tc_Node.ln_Type == NT_PROCESS && Process->pr_HomeDir != NULL)
  60.         {
  61.             strcpy(LocalBuffer,"PROGDIR:Classes/Gadgets");
  62.             LocalAddPart(LocalBuffer,Name);
  63.  
  64.             Result = OpenLibrary(LocalBuffer,0);
  65.         }
  66.  
  67.         if(!Result)
  68.         {
  69.             strcpy(LocalBuffer,":Classes/Gadgets");
  70.             LocalAddPart(LocalBuffer,Name);
  71.  
  72.             if(!(Result = OpenLibrary(LocalBuffer,0)))
  73.             {
  74.                 strcpy(LocalBuffer,"Gadgets");
  75.                 LocalAddPart(LocalBuffer,Name);
  76.  
  77.                 if(!(Result = OpenLibrary(LocalBuffer,0)))
  78.                     Result = OpenLibrary(Name,0);
  79.             }
  80.         }
  81.     }
  82.  
  83.     return(Result);
  84. }
  85.  
  86. #endif    /* DO_BOOPSI_KIND */
  87.  
  88.  
  89. /*****************************************************************************/
  90.  
  91.  
  92. VOID
  93. LTP_LayoutGadgets(LayoutHandle *Handle,ObjectNode *Group,LONG Left,LONG Top,LONG PlusWidth,LONG PlusHeight)
  94. {
  95.     if(!Handle->Failed)
  96.     {
  97.         STATIC const struct TagItem NoUnderscoreVanillaTags[] =
  98.         {
  99.             {TAG_DONE}
  100.         };
  101.  
  102.         STATIC const struct TagItem VanillaTags[] =
  103.         {
  104.             {GT_Underscore, '_'},
  105.             {TAG_DONE}
  106.         };
  107.  
  108.         STATIC const struct TagItem DisabledTags[] =
  109.         {
  110.             {GT_Underscore, '_' },
  111.             {GA_Disabled,    TRUE},
  112.             {TAG_DONE}
  113.         };
  114.  
  115.         STATIC const struct TagItem NoUnderscoreDisabledTags[] =
  116.         {
  117.             {GA_Disabled,    TRUE},
  118.             {TAG_DONE}
  119.         };
  120.  
  121.         struct NewGadget    NewGadget;
  122.  
  123.         struct Gadget *        Gadget;
  124.         struct Gadget *        Extra;
  125.         struct TagItem *    Tags;
  126.         ULONG                page;
  127.         ObjectNode *        Node;
  128.  
  129.         if(!Handle->List)
  130.         {
  131.             if(!(Handle->Previous = CreateContext(&Handle->List)))
  132.             {
  133.                 Handle->Failed = TRUE;
  134.  
  135.                 return;
  136.             }
  137.         }
  138.  
  139.         NewGadget.ng_TextAttr   = Handle->TextAttr;
  140.         NewGadget.ng_VisualInfo = Handle->VisualInfo;
  141.  
  142.         Group->Special.Group.Visible = TRUE;
  143.  
  144.         SCANPAGE(Group,Node,page)
  145.         {
  146.             if(Node->Type != FRAME_KIND && Node->Type != IMAGE_KIND && Node->Type != BLANK_KIND && Node->Type != BOX_KIND && Node->Type != XBAR_KIND && Node->Type != YBAR_KIND)
  147.             {
  148.                 Extra = NULL;
  149.  
  150.                 if(Node->GroupIndent)
  151.                 {
  152.                     NewGadget.ng_LeftEdge     = Node->Left + 4;
  153.                     NewGadget.ng_TopEdge    = Node->Top + 2;
  154.                     NewGadget.ng_Width        = Node->Width - (4 + 4);
  155.                     NewGadget.ng_Height        = Node->Height - (2 + 2);
  156.                 }
  157.                 else
  158.                 {
  159.                     NewGadget.ng_LeftEdge     = Node->Left;
  160.                     NewGadget.ng_TopEdge    = Node->Top;
  161.                     NewGadget.ng_Width        = Node->Width;
  162.                     NewGadget.ng_Height        = Node->Height;
  163.                 }
  164.  
  165.                 NewGadget.ng_GadgetText    = Node->Label ? Node->Label : (STRPTR)"";
  166.                 NewGadget.ng_GadgetID     = Node->ID;
  167.                 NewGadget.ng_UserData     = Node;
  168.  
  169.                 if(Node->NoKey)
  170.                 {
  171.                     if(Node->Disabled)
  172.                     {
  173.                         if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
  174.                             Tags = (struct TagItem *)NoUnderscoreVanillaTags;
  175.                         else
  176.                             Tags = (struct TagItem *)NoUnderscoreDisabledTags;
  177.                     }
  178.                     else
  179.                         Tags = (struct TagItem *)NoUnderscoreVanillaTags;
  180.                 }
  181.                 else
  182.                 {
  183.                     if(Node->Disabled)
  184.                     {
  185.                         if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
  186.                             Tags = (struct TagItem *)VanillaTags;
  187.                         else
  188.                             Tags = (struct TagItem *)DisabledTags;
  189.                     }
  190.                     else
  191.                         Tags = (struct TagItem *)VanillaTags;
  192.                 }
  193.  
  194.                 switch(Node->LabelPlace)
  195.                 {
  196.                     case PLACE_LEFT:
  197.  
  198.                         NewGadget.ng_Flags = PLACETEXT_LEFT;
  199.                         break;
  200.  
  201.                     case PLACE_RIGHT:
  202.  
  203.                         NewGadget.ng_Flags = PLACETEXT_RIGHT;
  204.                         break;
  205.  
  206.                     case PLACE_ABOVE:
  207.  
  208.                         NewGadget.ng_Flags = PLACETEXT_ABOVE;
  209.                         break;
  210.  
  211.                     case PLACE_BELOW:
  212.  
  213.                         NewGadget.ng_Flags = PLACETEXT_BELOW;
  214.                         break;
  215.  
  216.                     case PLACE_IN:
  217.  
  218.                         NewGadget.ng_Flags = PLACETEXT_IN;
  219.                         break;
  220.  
  221.                     default:
  222.  
  223.                         NewGadget.ng_Flags = NULL;
  224.                         break;
  225.                 }
  226.  
  227.                 if(Node->HighLabel)
  228.                     NewGadget.ng_Flags |= NG_HIGHLABEL;
  229.  
  230.                 Gadget = NULL; /* Always initialize this before entering the switch table. */
  231.  
  232.                 switch(Node->Type)
  233.                 {
  234.                     #ifdef DO_BOOPSI_KIND
  235.                     {
  236.                         case BOOPSI_KIND:
  237.                         {
  238.                             struct Gadget *Link;
  239.  
  240.                             if(Node->Special.BOOPSI.Link != NIL_LINK && Node->Special.BOOPSI.TagLink)
  241.                             {
  242.                                 if(!(Link = LTP_FindGadgetLinear(Handle,Node->Special.BOOPSI.Link)))
  243.                                 {
  244.                                     Handle->Failed = TRUE;
  245.  
  246.                                     return;    /* Note: must return since we are in a loop that
  247.                                              *       creates all gadgets for the current page.
  248.                                              */
  249.                                 }
  250.                             }
  251.                             else
  252.                                 Link = NULL;
  253.  
  254.                             if(Node->Special.BOOPSI.ClassLibraryName)
  255.                             {
  256.                                 if(!(Node->Special.BOOPSI.ClassBase = OpenClass(Node->Special.BOOPSI.ClassLibraryName)))
  257.                                 {
  258.                                     break;
  259.                                 }
  260.                             }
  261.  
  262.                             if(Node->Special.BOOPSI.FullWidth)
  263.                             {
  264.                                 NewGadget.ng_LeftEdge    = Node->Special.BOOPSI.Parent->Left;
  265.                                 NewGadget.ng_Width        = Node->Special.BOOPSI.Parent->Width;
  266.                             }
  267.  
  268.                             if(Node->Special.BOOPSI.FullHeight)
  269.                             {
  270.                                 NewGadget.ng_TopEdge    = Node->Special.BOOPSI.Parent->Top;
  271.                                 NewGadget.ng_Height        = Node->Special.BOOPSI.Parent->Height;
  272.                             }
  273.  
  274.                             Gadget = NewObject(Node->Special.BOOPSI.ClassInstance,Node->Special.BOOPSI.ClassName,
  275.                                 GA_Left,        NewGadget.ng_LeftEdge,
  276.                                 GA_Top,            NewGadget.ng_TopEdge,
  277.                                 GA_Width,        NewGadget.ng_Width,
  278.                                 GA_Height,        NewGadget.ng_Height,
  279.                                 GA_Disabled,    Node->Disabled,
  280.                                 GA_ID,            Node->ID,
  281.                                 GA_UserData,    Node,
  282.  
  283.                                 Link ? Node->Special.BOOPSI.TagLink : TAG_IGNORE,                                    Link,
  284.                                 Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,                                    Handle->BOOPSIPrevious,
  285.                                 Node->Special.BOOPSI.TagTextAttr ? Node->Special.BOOPSI.TagTextAttr : TAG_IGNORE,    Handle->TextAttr,
  286.                                 Node->Special.BOOPSI.TagDrawInfo ? Node->Special.BOOPSI.TagDrawInfo : TAG_IGNORE,    Handle->DrawInfo,
  287.                                 Node->Special.BOOPSI.TagScreen ? Node->Special.BOOPSI.TagScreen : TAG_IGNORE,        Handle->Screen,
  288.                                 Node->Special.BOOPSI.ClassTags ? TAG_MORE : TAG_DONE,                                Node->Special.BOOPSI.ClassTags);
  289.  
  290.                             break;
  291.                         }
  292.                     }
  293.                     #endif /* DO_BOOPSI_KIND */
  294.  
  295.                     #ifdef DO_POPUP_KIND
  296.                     {
  297.                         case POPUP_KIND:
  298.  
  299.                             Gadget = NewObject(LTP_PopupClass,NULL,
  300.                                 GA_Left,            NewGadget.ng_LeftEdge,
  301.                                 GA_Top,                NewGadget.ng_TopEdge,
  302.                                 GA_Width,            NewGadget.ng_Width,
  303.                                 GA_Height,            NewGadget.ng_Height,
  304.                                 GA_Disabled,        Node->Disabled,
  305.                                 GA_ID,                Node->ID,
  306.                                 GA_UserData,        Node,
  307.                                 GA_RelVerify,        TRUE,
  308.                                 PIA_Labels,            Node->Special.Popup.Choices,
  309.                                 PIA_Active,            Node->Current,
  310.                                 PIA_Font,            Handle->TextAttr,
  311.                                 PIA_CentreActive,    Node->Special.Popup.CentreActive,
  312.                                 PIA_AspectX,        Handle->AspectX,
  313.                                 PIA_AspectY,        Handle->AspectY,
  314.  
  315.                                 Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  316.                             TAG_DONE);
  317.  
  318.                             break;
  319.                     }
  320.                     #endif /* DO_POPUP_KIND */
  321.  
  322.                     #ifdef DO_TAB_KIND
  323.                     {
  324.                         case TAB_KIND:
  325.  
  326.                             if(Node->Special.Tab.FullWidth)
  327.                             {
  328.                                 NewGadget.ng_LeftEdge    = Handle->TopGroup->Left    - Left;
  329.                                 NewGadget.ng_Width        = Handle->TopGroup->Width    + PlusWidth;
  330.  
  331.                                 NewGadget.ng_LeftEdge    += Handle->Screen->WBorLeft;
  332.                                 NewGadget.ng_Width        -= Handle->Screen->WBorLeft + Handle->Screen->WBorRight;
  333.                             }
  334.                             else
  335.                             {
  336.                                 NewGadget.ng_LeftEdge    = Node->Special.Tab.Parent->Left;
  337.                                 NewGadget.ng_Width        = Node->Special.Tab.Parent->Width;
  338.                             }
  339.  
  340.                             Gadget = NewObject(LTP_TabClass,NULL,
  341.                                 GA_Left,        NewGadget.ng_LeftEdge,
  342.                                 GA_Top,            NewGadget.ng_TopEdge,
  343.                                 GA_Width,        NewGadget.ng_Width,
  344.                                 GA_Height,        NewGadget.ng_Height,
  345.                                 GA_Disabled,    Node->Disabled,
  346.                                 GA_ID,            Node->ID,
  347.                                 GA_UserData,    Node,
  348.                                 GA_RelVerify,    TRUE,
  349.                                 TIA_Labels,        Node->Special.Popup.Choices,
  350.                                 TIA_Index,        Node->Current,
  351.                                 TIA_Font,        Handle->TextAttr,
  352.                                 TIA_DrawInfo,    Handle->DrawInfo,
  353.                                 TIA_Screen,        Handle->Screen,
  354.  
  355.                                 Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  356.                             TAG_DONE);
  357.  
  358.                             break;
  359.                     }
  360.                     #endif    // DO_TAB_KIND
  361.  
  362.                     #ifdef DO_LEVEL_KIND
  363.                     {
  364.                         case LEVEL_KIND:
  365.                         {
  366.                             LONG Current;
  367.  
  368.                             if(Node->Special.Level.Freedom == FREEHORIZ)
  369.                                 Current = Node->Current;
  370.                             else
  371.                                 Current = Node->Max - Node->Current;
  372.  
  373.                             Gadget = NewObject(LTP_LevelClass,NULL,
  374.                                 GA_Left,        NewGadget.ng_LeftEdge,
  375.                                 GA_Top,            NewGadget.ng_TopEdge,
  376.                                 GA_Width,        NewGadget.ng_Width,
  377.                                 GA_Height,        NewGadget.ng_Height,
  378.                                 GA_Disabled,    Node->Disabled,
  379.                                 GA_ID,            Node->ID,
  380.                                 GA_UserData,    Node,
  381.                                 GA_RelVerify,    TRUE,
  382.                                 GA_Immediate,    TRUE,
  383.                                 GA_FollowMouse,    TRUE,
  384.                                 PGA_Freedom,    Node->Special.Level.Freedom,
  385.                                 SLA_UseTicks,    Node->Special.Level.Ticks,
  386.                                 SLA_NumTicks,    Node->Special.Level.NumTicks,
  387.                                 SLA_DrawInfo,    Handle->DrawInfo,
  388.                                 SLA_Current,    Current        - Node->Special.Level.Plus,
  389.                                 SLA_Max,        Node->Max    - Node->Special.Level.Plus,
  390.                                 SLA_Reference,    Handle->GlyphHeight,
  391.  
  392.                                 Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  393.                             TAG_DONE);
  394.  
  395.                             if(Gadget != NULL)
  396.                             {
  397.                                 if(Node->Special.Level.Freedom == FREEHORIZ)
  398.                                 {
  399.                                     SetAttrs(Gadget,
  400.                                         GA_Top, NewGadget.ng_TopEdge + (Node->Height - Gadget->Height) / 2,
  401.                                     TAG_DONE);
  402.                                 }
  403.                                 else
  404.                                 {
  405.                                     SetAttrs(Gadget,
  406.                                         GA_Left, NewGadget.ng_LeftEdge + (Node->Width - Gadget->Width) / 2,
  407.                                     TAG_DONE);
  408.                                 }
  409.                             }
  410.  
  411.                             break;
  412.                         }
  413.                     }
  414.                     #endif    /* DO_LEVEL_KIND */
  415.  
  416.                     #ifdef DO_TEXTEDIT_KIND
  417.                     {
  418.                         case TEXTEDIT_KIND:
  419.  
  420.                             Gadget = NewObject(LTP_TextEditClass,NULL,
  421.                                 GA_Left,            NewGadget.ng_LeftEdge,
  422.                                 GA_Top,                NewGadget.ng_TopEdge,
  423.                                 GA_Width,            NewGadget.ng_Width,
  424.                                 GA_Height,            NewGadget.ng_Height,
  425.                                 GA_Disabled,        Node->Disabled,
  426.                                 GA_ID,                Node->ID,
  427.                                 GA_UserData,        Node,
  428.                                 GA_RelVerify,        TRUE,
  429.                                 GA_DrawInfo,        Handle->DrawInfo,
  430.                                 GA_TabCycle,        TRUE,
  431.                                 GA_Immediate,        TRUE,
  432.                                 STRINGA_Buffer,        Node->Special.TextEdit.String,
  433.                                 STRINGA_Font,        Node->Special.TextEdit.Font,
  434.                                 STRINGA_ExitHelp,    TRUE,
  435.  
  436.                                 Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
  437.                             TAG_DONE);
  438.  
  439.                             break;
  440.                     }
  441.                     #endif /* DO_TEXTEDIT_KIND */
  442.  
  443.                     case BUTTON_KIND:
  444.                     {
  445.                         register BOOL IsNonStandardButton;
  446.  
  447.                         #ifdef OLD_STYLE_DEFAULT_KEY
  448.                         {
  449.                             IsNonStandardButton = (BOOL)(Node->Special.Button.Lines != NULL);
  450.                         }
  451.                         #else
  452.                         {
  453.                             IsNonStandardButton = (BOOL)(    (Node->Special.Button.Lines != NULL) ||
  454.                                                             (Node->Special.Button.ReturnKey != NULL)
  455.                                                         );
  456.                         }
  457.                         #endif /* OLD_STYLE_DEFAULT_KEY */
  458.  
  459.                         if(IsNonStandardButton)
  460.                         {
  461.                             #ifndef OLD_STYLE_DEFAULT_KEY
  462.                             {
  463.                                 if(Node->Special.Button.ReturnKey)
  464.                                     Handle->TextAttr->ta_Style |= FSF_BOLD;
  465.                             }
  466.                             #endif    /* !OLD_STYLE_DEFAULT_KEY */
  467.  
  468.                             if(Node->Special.Button.ButtonImage = NewObject(LTP_ImageClass,NULL,
  469.                                 IIA_ImageType,    IMAGECLASS_MULTILINEBUTTON,
  470.                                 IIA_Lines,        Node->Special.Button.Lines,
  471.                                 IIA_LineCount,    Node->Special.Button.LineCount,
  472.                                 IIA_KeyStroke,    Node->Special.Button.KeyStroke,
  473.                                 IIA_Emboss,        Node->Special.Button.ReturnKey,
  474.                                 IIA_Label,        Node->Label,
  475.                                 IIA_Font,        Handle->TextAttr,
  476.                                 IA_Width,        NewGadget.ng_Width,
  477.                                 IA_Height,        NewGadget.ng_Height,
  478.                             TAG_DONE))
  479.                             {
  480.                                 NewGadget.ng_GadgetText    = "";
  481.                                 NewGadget.ng_Flags        = NULL;
  482.  
  483.                                 if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
  484.                                 {
  485.                                     Gadget->GadgetType        |= GTYP_BOOLGADGET;
  486.  
  487.                                     Gadget->Flags             = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  488.                                     Gadget->Activation        = GACT_RELVERIFY;
  489.  
  490.                                     Gadget->GadgetRender    = Node->Special.Button.ButtonImage;
  491.                                     Gadget->SelectRender    = Node->Special.Button.ButtonImage;
  492.  
  493.                                     if(Node->Disabled)
  494.                                         Gadget->Flags |= GFLG_DISABLED;
  495.                                 }
  496.                             }
  497.  
  498.                             #ifndef OLD_STYLE_DEFAULT_KEY
  499.                             {
  500.                                 if(Node->Special.Button.ReturnKey)
  501.                                     Handle->TextAttr->ta_Style &= ~FSF_BOLD;
  502.                             }
  503.                             #endif    /* !OLD_STYLE_DEFAULT_KEY */
  504.                         }
  505.                         else
  506.                         {
  507.                             Gadget = CreateGadgetA(BUTTON_KIND,Handle->Previous,&NewGadget,Tags);
  508.                         }
  509.  
  510.                         break;
  511.                     }
  512.  
  513.                     case GROUP_KIND:
  514.  
  515.                         LTP_LayoutGadgets(Handle,Node,Left,Top,PlusWidth,PlusHeight);
  516.  
  517.                         continue;
  518.  
  519.                     case CHECKBOX_KIND:
  520.  
  521.                         Gadget = CreateGadget(CHECKBOX_KIND,Handle->Previous,&NewGadget,
  522.                             GTCB_Checked,    Node->Current,
  523.                             GTCB_Scaled,    TRUE,
  524.                         TAG_MORE,Tags);
  525.  
  526.                         break;
  527.  
  528.                     case LISTVIEW_KIND:
  529.                     {
  530.                         struct TextFont *LocalFont = NULL;
  531.                         ULONG WhichTag;
  532.                         struct Gadget * LinkedGadget;
  533.  
  534.                         if(!Node->Special.List.ReadOnly && Node->Special.List.LinkID != -1 && Node->Special.List.LinkID != NIL_LINK)
  535.                             LinkedGadget = Node->Special.List.Link = LTP_FindGadgetLinear(Handle,Node->Special.List.LinkID);
  536.                         else
  537.                             LinkedGadget = NULL;
  538.  
  539.                         if((NewGadget.ng_Flags & PLACETEXT_ABOVE) && Node->Label && Node->Special.List.FlushLabelLeft)
  540.                             NewGadget.ng_GadgetText = "";
  541.  
  542.                         if(Node->Special.List.TextAttr)
  543.                         {
  544.                                 // Use the system default font?
  545.  
  546.                             if(Node->Special.List.TextAttr == (struct TextAttr *)~0)
  547.                             {
  548.                                 Forbid();
  549.  
  550.                                 LTP_GetDefaultFont(&Handle->FixedFont);
  551.  
  552.                                 if(!(LocalFont = OpenFont((struct TextAttr *)&Handle->FixedFont)))
  553.                                 {
  554.                                     Permit();
  555.  
  556.                                     Handle->Failed = TRUE;
  557.  
  558.                                     break;
  559.                                 }
  560.  
  561.                                 NewGadget.ng_TextAttr = (struct TextAttr *)&Handle->FixedFont;
  562.                             }
  563.                             else
  564.                             {
  565.                                 NewGadget.ng_TextAttr = Node->Special.List.TextAttr;
  566.                             }
  567.  
  568.                             NewGadget.ng_GadgetText = "";
  569.                         }
  570.  
  571.                         if(V39)
  572.                             WhichTag = GTLV_MakeVisible;
  573.                         else
  574.                             WhichTag = GTLV_Top;
  575.  
  576.                         Gadget = CreateGadget(LISTVIEW_KIND,Handle->Previous,&NewGadget,
  577.                             GTLV_Selected,        Node->Current,
  578.                             GTLV_ReadOnly,        Node->Special.List.ReadOnly,
  579.                             GTLV_ScrollWidth,    2 + 2 * Handle->GlyphWidth + 2,
  580.  
  581.                             Node->Current >= 0 ? WhichTag : TAG_IGNORE,                            Node->Current,
  582.                             Node->Special.List.Labels ? GTLV_Labels : TAG_IGNORE,                Node->Special.List.Labels,
  583.                             Node->Special.List.LinkID != -1 ? GTLV_ShowSelected : TAG_IGNORE,    LinkedGadget,
  584.                             Node->Special.List.CallBack ?    GTLV_CallBack : TAG_IGNORE,            Node->Special.List.CallBack,
  585.                             Node->Special.List.MaxPen ?    GTLV_MaxPen : TAG_IGNORE,                Node->Special.List.MaxPen,
  586.                         TAG_MORE,Tags);
  587.  
  588.                         if(Node->Special.List.TextAttr)
  589.                         {
  590.                             NewGadget.ng_TextAttr = Handle->TextAttr;
  591.  
  592.                             if(LocalFont)
  593.                             {
  594.                                 CloseFont(LocalFont);
  595.  
  596.                                 Permit();
  597.                             }
  598.                         }
  599.  
  600.                         break;
  601.                     }
  602.  
  603.                     case MX_KIND:
  604.  
  605.                         NewGadget.ng_Height = Handle->GlyphHeight;
  606.  
  607.                         Gadget = CreateGadget(MX_KIND,Handle->Previous,&NewGadget,
  608.                             GTMX_Labels,    Node->Special.Radio.Choices,
  609.                             GTMX_Active,    Node->Current,
  610.                             GTMX_Spacing,    Handle->InterHeight,
  611.                             GTMX_Scaled,    TRUE,
  612.  
  613.                             Node->Label ? GTMX_TitlePlace : TAG_IGNORE,  Node->Special.Radio.TitlePlace,
  614.                         TAG_MORE,Tags);
  615.  
  616.                         break;
  617.  
  618.                     case TEXT_KIND:
  619.  
  620.                         if(Node->Special.Text.UsePicker)
  621.                             NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
  622.  
  623.                         if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,
  624.                             GTTX_Border,        Node->Special.Text.Border,
  625.                             GTTX_Justification,    Node->Special.Text.Justification,
  626.                             GTTX_Clipped,        TRUE,
  627.  
  628.                             Node->Special.Text.Text ? GTTX_Text : TAG_IGNORE,Node->Special.Text.Text,
  629.                             Node->Special.Text.FrontPen != -1 ? GTTX_FrontPen : TAG_IGNORE,Node->Special.Text.FrontPen,
  630.                             Node->Special.Text.BackPen != -1 ? GTTX_BackPen : TAG_IGNORE,Node->Special.Text.BackPen,
  631.                         TAG_MORE,Tags))
  632.                         {
  633.                             if(Node->Special.Text.UsePicker)
  634.                             {
  635.                                 Handle->Previous = Gadget;
  636.  
  637.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  638.  
  639.                                 if(!Extra)
  640.                                     Gadget = NULL;
  641.  
  642.                                 Node->Special.Text.Picker = Extra;
  643.                             }
  644.                         }
  645.  
  646.                         break;
  647.  
  648.                     #ifdef DO_GAUGE_KIND
  649.                     {
  650.                         case GAUGE_KIND:
  651.  
  652.                             NewGadget.ng_Height -= Handle->InterHeight + Handle->GlyphHeight + 2;
  653.  
  654.                             Gadget = CreateGadgetA(TEXT_KIND,Handle->Previous,&NewGadget,NULL);
  655.  
  656.                             break;
  657.                     }
  658.                     #endif
  659.  
  660.                     #ifdef DO_TAPEDECK_KIND
  661.                     {
  662.                         case TAPEDECK_KIND:
  663.  
  664.                             if(Node->Special.TapeDeck.ButtonType >= TDBT_BACKWARD && Node->Special.TapeDeck.ButtonType < TDBTLAST)
  665.                             {
  666.                                 LONG    ImageType;
  667.                                 LONG    Activation,
  668.                                         Flags;
  669.  
  670.                                 if(Node->Special.TapeDeck.Toggle)
  671.                                     Activation = GACT_TOGGLESELECT | GACT_IMMEDIATE;
  672.                                 else
  673.                                 {
  674.                                     if(Node->Special.TapeDeck.Tick)
  675.                                     {
  676.                                         Activation = GACT_RELVERIFY | GACT_IMMEDIATE;
  677.  
  678.                                         Handle->IDCMP |= IDCMP_GADGETDOWN | IDCMP_GADGETUP | IDCMP_INTUITICKS;
  679.                                     }
  680.                                     else
  681.                                         Activation = GACT_RELVERIFY;
  682.                                 }
  683.  
  684.                                 if(Node->Current)
  685.                                     Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_SELECTED;
  686.                                 else
  687.                                     Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  688.  
  689.                                 switch(Node->Special.TapeDeck.ButtonType)
  690.                                 {
  691.                                     case TDBT_BACKWARD:
  692.  
  693.                                         ImageType = IMAGECLASS_BACKWARD;
  694.                                         break;
  695.  
  696.                                     case TDBT_FORWARD:
  697.  
  698.                                         ImageType = IMAGECLASS_FORWARD;
  699.                                         break;
  700.  
  701.                                     case TDBT_PREVIOUS:
  702.  
  703.                                         ImageType = IMAGECLASS_PREVIOUS;
  704.                                         break;
  705.  
  706.                                     case TDBT_NEXT:
  707.  
  708.                                         ImageType = IMAGECLASS_NEXT;
  709.                                         break;
  710.  
  711.                                     case TDBT_RECORD:
  712.  
  713.                                         ImageType = IMAGECLASS_RECORD;
  714.                                         break;
  715.  
  716.                                     case TDBT_PLAY:
  717.  
  718.                                         ImageType = IMAGECLASS_PLAY;
  719.                                         break;
  720.  
  721.                                     case TDBT_STOP:
  722.  
  723.                                         ImageType = IMAGECLASS_STOP;
  724.                                         break;
  725.  
  726.                                     case TDBT_PAUSE:
  727.  
  728.                                         ImageType = IMAGECLASS_PAUSE;
  729.                                         break;
  730.  
  731.                                     case TDBT_REWIND:
  732.  
  733.                                         ImageType = IMAGECLASS_REWIND;
  734.                                         break;
  735.  
  736.                                     case TDBT_EJECT:
  737.  
  738.                                         ImageType = IMAGECLASS_EJECT;
  739.                                         break;
  740.  
  741.                                     default:    /* Should never happen! */
  742.  
  743.                                         ImageType = -1;
  744.                                         break;
  745.                                 }
  746.  
  747.                                 if(ImageType != -1)
  748.                                 {
  749.                                     if(Node->Special.TapeDeck.ButtonImage = NewObject(LTP_ImageClass,NULL,
  750.                                         IIA_ImageType,    ImageType,
  751.                                         IIA_GlyphWidth, Node->Special.TapeDeck.ButtonWidth,
  752.                                         IIA_GlyphHeight,Node->Special.TapeDeck.ButtonHeight,
  753.                                         IA_Width,        NewGadget.ng_Width,
  754.                                         IA_Height,        NewGadget.ng_Height,
  755.                                     TAG_DONE))
  756.                                     {
  757.                                         NewGadget.ng_GadgetText    = "";
  758.                                         NewGadget.ng_Flags        = NULL;
  759.  
  760.                                         if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
  761.                                         {
  762.                                             Gadget->GadgetType        |= GTYP_BOOLGADGET;
  763.                                             Gadget->Flags             |= Flags;
  764.                                             Gadget->Activation        |= Activation;
  765.  
  766.                                             Gadget->GadgetRender     = Node->Special.TapeDeck.ButtonImage;
  767.                                             Gadget->SelectRender     = Node->Special.TapeDeck.ButtonImage;
  768.  
  769.                                             if(Node->Disabled)
  770.                                                 Gadget->Flags |= GFLG_DISABLED;
  771.                                         }
  772.                                     }
  773.                                 }
  774.                             }
  775.  
  776.                             break;
  777.                     }
  778.                     #endif    /* DO_TAPEDECK_KIND */
  779.  
  780.                     case NUMBER_KIND:
  781.  
  782.                         Gadget = CreateGadget(NUMBER_KIND,Handle->Previous,&NewGadget,
  783.                             GTNM_Number,        Node->Special.Number.Number,
  784.                             GTNM_Border,        Node->Special.Number.Border,
  785.                             GTNM_Justification,    Node->Special.Number.Justification,
  786.                             GTNM_Border,        Node->Special.Number.Border,
  787.                             GTNM_Format,        Node->Special.Number.Format ? Node->Special.Number.Format : (STRPTR)"%ld",
  788.                             GTNM_Clipped,        TRUE,
  789.                             GTNM_MaxNumberLen,    Node->Special.Number.MaxNumberLen,
  790.  
  791.                             Node->Special.Number.FrontPen != -1 ? GTNM_FrontPen : TAG_IGNORE,Node->Special.Number.FrontPen,
  792.                             Node->Special.Number.BackPen != -1 ? GTNM_BackPen : TAG_IGNORE,Node->Special.Number.BackPen,
  793.                         TAG_MORE,Tags);
  794.  
  795.                         break;
  796.  
  797.                     case CYCLE_KIND:
  798.  
  799.                         Gadget = CreateGadget(CYCLE_KIND,Handle->Previous,&NewGadget,
  800.                             GTCY_Labels,        Node->Special.Cycle.Choices,
  801.                             GTCY_Active,        Node->Current,
  802.                         TAG_MORE,Tags);
  803.  
  804.                         break;
  805.  
  806.                     case PALETTE_KIND:
  807.  
  808.                         if(Node->Special.Palette.UsePicker)
  809.                         {
  810.                             NewGadget.ng_Width = Node->Special.Palette.IndicatorWidth;
  811.  
  812.                             if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,TAG_MORE,Tags))
  813.                             {
  814.                                 Handle->Previous = Gadget;
  815.  
  816.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  817.  
  818.                                 if(!Extra)
  819.                                     Gadget = NULL;
  820.  
  821.                                 Node->Special.Palette.Picker = Extra;
  822.                             }
  823.                         }
  824.                         else
  825.                         {
  826.                             Gadget = CreateGadget(PALETTE_KIND,Handle->Previous,&NewGadget,
  827.                                 GTPA_Depth,                Node->Special.Palette.Depth,
  828.                                 GTPA_Color,                Node->Current,
  829.                                 GTPA_ColorOffset,        Node->Min,
  830.                                 GTPA_IndicatorWidth,    max(10,Node->Width / (Node->Max - Node->Min + 1)),
  831.                                 GTPA_IndicatorHeight,    Node->Height,
  832.  
  833.                                 Node->Special.Palette.ColourTable ? GTPA_ColorTable : TAG_IGNORE,Node->Special.Palette.ColourTable,
  834.                             TAG_MORE,Tags);
  835.                         }
  836.  
  837.                         break;
  838.  
  839.                     case SLIDER_KIND:
  840.  
  841.                         Gadget = CreateGadget(SLIDER_KIND,Handle->Previous,&NewGadget,
  842.                             GTSL_Min,            Node->Min,
  843.                             GTSL_Max,            Node->Max,
  844.                             GTSL_Level,            Node->Current,
  845.                             GTSL_MaxLevelLen,    Node->Special.Slider.MaxLevelLen,
  846.                             GTSL_LevelPlace,    Node->Special.Slider.LevelPlace,
  847.                             GTSL_LevelFormat,    Node->Special.Slider.LevelFormat ? Node->Special.Slider.LevelFormat : (STRPTR)"%ld",
  848.                             GA_RelVerify,        TRUE,
  849.  
  850.                             V40 ? GTSL_MaxPixelLen : TAG_IGNORE,                        Node->Special.Slider.LevelWidth,
  851.                             V40 ? GTSL_Justification : TAG_IGNORE,                        GTJ_RIGHT,
  852.                             Node->Special.Slider.DispFunc ? GTSL_DispFunc : TAG_IGNORE,    Node->Special.Slider.DispFunc,
  853.                         TAG_MORE,Tags);
  854.  
  855.                         break;
  856.  
  857.                     case SCROLLER_KIND:
  858.  
  859.                         if(Node->Special.Scroller.FullSize)
  860.                         {
  861.                             if(Node->Special.Scroller.Vertical)
  862.                             {
  863.                                 NewGadget.ng_TopEdge    = Node->Special.Scroller.Parent->Top;
  864.                                 NewGadget.ng_Height        = Node->Special.Scroller.Parent->Height;
  865.                             }
  866.                             else
  867.                             {
  868.                                 NewGadget.ng_LeftEdge    = Node->Special.Scroller.Parent->Left;
  869.                                 NewGadget.ng_Width        = Node->Special.Scroller.Parent->Width;
  870.                             }
  871.                         }
  872.  
  873.                         Gadget = CreateGadget(SCROLLER_KIND,Handle->Previous,&NewGadget,
  874.                             GA_RelVerify,    Node->Special.Scroller.RelVerify,
  875.                             GA_Immediate,    Node->Special.Scroller.Immediate,
  876.                             GTSC_Top,        Node->Current,
  877.                             GTSC_Total,        Node->Max,
  878.                             GTSC_Visible,    Node->Special.Scroller.Visible,
  879.                             PGA_Freedom,    Node->Special.Scroller.Vertical ? LORIENT_VERT : LORIENT_HORIZ,
  880.  
  881.                             Node->Special.Scroller.Arrows ? GTSC_Arrows : TAG_IGNORE,Node->Special.Scroller.ArrowSize,
  882.                         TAG_MORE,Tags);
  883.  
  884.                         break;
  885.  
  886.                     case FRACTION_KIND:
  887.                     case STRING_KIND:
  888.                     {
  889.                         STRPTR String;
  890.  
  891.                         String = Node->Special.String.String;
  892.  
  893.                         if(Node->Type == FRACTION_KIND)
  894.                         {
  895.                             UBYTE DecimalPoint;
  896.  
  897.                             LTP_CopyFraction(Node->Special.String.RealString,String);
  898.                             String = Node->Special.String.RealString;
  899.  
  900.                             DecimalPoint = LTP_DecimalPoint[0];
  901.  
  902.                             if(DecimalPoint != '.')
  903.                             {
  904.                                 LONG i;
  905.  
  906.                                 for(i = 0 ; i < strlen(String) ; i++)
  907.                                 {
  908.                                     if(String[i] == '.')
  909.                                     {
  910.                                         String[i] = DecimalPoint;
  911.                                         break;
  912.                                     }
  913.                                 }
  914.                             }
  915.  
  916.                             if(Node->Special.String.IncrementerHook)
  917.                             {
  918.                                 NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  919.                                 NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  920.                             }
  921.                         }
  922.  
  923.                         if(Node->Special.String.LinkID != -1)
  924.                         {
  925.                             ObjectNode *ListView = LTP_FindNode(Handle,Node->Special.String.LinkID);
  926.  
  927.                             if(ListView)
  928.                             {
  929.                                 NewGadget.ng_LeftEdge    = ListView->Left;
  930.                                 NewGadget.ng_TopEdge    = ListView->Top + ListView->Height;
  931.                                 NewGadget.ng_Width        = ListView->Width;
  932.                             }
  933.                         }
  934.  
  935.                         if(Node->Special.String.UsePicker)
  936.                             NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
  937.  
  938.                         if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  939.                             GTST_String,            String,
  940.                             GTST_MaxChars,            Node->Special.String.MaxChars,
  941.                             GTST_EditHook,            Node->Special.String.EditHook ? Node->Special.String.EditHook : Handle->StandardEditHook,
  942.                             GA_Immediate,            TRUE,
  943.                             STRINGA_Justification,    Node->Special.String.Justification,
  944.                         TAG_MORE,Tags))
  945.                         {
  946.                             if(!V39)
  947.                                 Gadget->Activation |= GACT_IMMEDIATE;
  948.  
  949.                             if(Node->Special.String.UsePicker)
  950.                             {
  951.                                 Handle->Previous = Gadget;
  952.  
  953.                                 Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
  954.  
  955.                                 if(!Extra)
  956.                                     Gadget = NULL;
  957.  
  958.                                 Node->Special.String.Picker = Extra;
  959.                             }
  960.                             else
  961.                             {
  962.                                 if(Node->Type == FRACTION_KIND && Node->Special.String.IncrementerHook)
  963.                                 {
  964.                                     Handle->Previous = Gadget;
  965.  
  966.                                     if(Node->Special.String.LeftIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_LEFTINCREMENTER,-1))
  967.                                     {
  968.                                         Handle->Previous = Node->Special.String.LeftIncrementer;
  969.  
  970.                                         if(Node->Special.String.RightIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_RIGHTINCREMENTER,1))
  971.                                             Extra = Node->Special.String.RightIncrementer;
  972.                                         else
  973.                                             Gadget = NULL;
  974.                                     }
  975.                                     else
  976.                                         Gadget = NULL;
  977.                                 }
  978.                             }
  979.                         }
  980.  
  981.                         break;
  982.                     }
  983.  
  984.                     #ifdef DO_PASSWORD_KIND
  985.                     {
  986.                         case PASSWORD_KIND:
  987.                         {
  988.                             LONG Len;
  989.  
  990.                             if(Len = strlen(Node->Special.String.RealString))
  991.                                 memset(Node->Special.String.Original,'·',Len);
  992.  
  993.                             Node->Special.String.Original[Len] = 0;
  994.  
  995.                             if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  996.                                 GTST_String,            Node->Special.String.Original,
  997.                                 GTST_MaxChars,            Node->Special.String.MaxChars,
  998.                                 GTST_EditHook,            &Handle->PasswordEditHook,
  999.                                 GA_Immediate,            TRUE,
  1000.                                 STRINGA_Justification,    Node->Special.String.Justification,
  1001.                             TAG_MORE,Tags))
  1002.                             {
  1003.                                 if(!V39)
  1004.                                     Gadget->Activation |= GACT_IMMEDIATE;
  1005.                             }
  1006.  
  1007.                             break;
  1008.                         }
  1009.                     }
  1010.                     #endif
  1011.  
  1012.                     case INTEGER_KIND:
  1013.  
  1014.                         if(Node->Special.Integer.UseIncrementers)
  1015.                         {
  1016.                             NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  1017.                             NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
  1018.  
  1019.                             if(Node->Special.Integer.IncrementerHook)
  1020.                             {
  1021.                                 LONG Value;
  1022.  
  1023.                                 Value = (LONG)CallHookPkt(Node->Special.Integer.IncrementerHook,(APTR)Node->Special.Integer.Number,(APTR)INCREMENTERMSG_INITIAL);
  1024.  
  1025.                                 if(Value < Node->Min)
  1026.                                     Value = Node->Min;
  1027.                                 else
  1028.                                 {
  1029.                                     if(Value > Node->Max)
  1030.                                         Value = Node->Max;
  1031.                                 }
  1032.  
  1033.                                 Node->Special.Integer.Number = Value;
  1034.                             }
  1035.                         }
  1036.  
  1037.                         #ifndef DO_HEXHOOK
  1038.                         {
  1039.                             Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
  1040.                                 GTIN_Number,            Node->Special.Integer.Number,
  1041.                                 GTIN_MaxChars,            Node->Special.Integer.MaxChars,
  1042.                                 GTIN_EditHook,            Node->Special.Integer.EditHook ? Node->Special.Integer.EditHook : Handle->StandardEditHook,
  1043.                                 GA_Immediate,            TRUE,
  1044.                                 STRINGA_Justification,    Node->Special.Integer.Justification,
  1045.                             TAG_MORE,Tags);
  1046.                         }
  1047.                         #else
  1048.                         {
  1049.                             if(Node->Special.Integer.EditHook)
  1050.                             {
  1051.                                 Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
  1052.                                     GTIN_Number,            Node->Special.Integer.Number,
  1053.                                     GTIN_MaxChars,            Node->Special.Integer.MaxChars,
  1054.                                     GTIN_EditHook,            Node->Special.Integer.EditHook,
  1055.                                     GA_Immediate,            TRUE,
  1056.                                     STRINGA_Justification,    Node->Special.Integer.Justification,
  1057.                                 TAG_MORE,Tags);
  1058.                             }
  1059.                             else
  1060.                             {
  1061.                                 UBYTE LocalBuffer[20];
  1062.  
  1063.                                 SPrintf(LocalBuffer,"%ld",Node->Special.Integer.Number);
  1064.  
  1065.                                 Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
  1066.                                     GTST_String,            LocalBuffer,
  1067.                                     GTST_MaxChars,            Node->Special.Integer.MaxChars,
  1068.                                     GTST_EditHook,            &Handle->HexEditHook,
  1069.                                     GA_Immediate,            TRUE,
  1070.                                     STRINGA_Justification,    Node->Special.Integer.Justification,
  1071.                                 TAG_MORE,Tags);
  1072.                             }
  1073.  
  1074.                             if(Gadget)
  1075.                             {
  1076.                                 struct StringInfo *StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
  1077.  
  1078.                                 StringInfo->LongInt = Node->Special.Integer.Number;
  1079.                             }
  1080.                         }
  1081.                         #endif /* DO_HEXHOOK */
  1082.  
  1083.                         if(Gadget)
  1084.                         {
  1085.                             if(!V39)
  1086.                                 Gadget->Activation |= GACT_IMMEDIATE;
  1087.  
  1088.                             if(Node->Special.Integer.UseIncrementers)
  1089.                             {
  1090.                                 Handle->Previous = Gadget;
  1091.  
  1092.                                 if(Node->Special.Integer.LeftIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_LEFTINCREMENTER,-1))
  1093.                                 {
  1094.                                     Handle->Previous = Node->Special.Integer.LeftIncrementer;
  1095.  
  1096.                                     if(Node->Special.Integer.RightIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_RIGHTINCREMENTER,1))
  1097.                                         Extra = Node->Special.Integer.RightIncrementer;
  1098.                                     else
  1099.                                         Gadget = NULL;
  1100.                                 }
  1101.                                 else
  1102.                                     Gadget = NULL;
  1103.                             }
  1104.                         }
  1105.  
  1106.                         break;
  1107.                 }
  1108.  
  1109.                 if(Gadget != NULL)
  1110.                 {
  1111.                     Handle->GadgetArray[Handle->Index++] = Gadget;
  1112.  
  1113.                     Node->Host = Gadget;
  1114.  
  1115.                     #ifdef DO_BOOPSI_KIND
  1116.                     {
  1117.                         if(Node->Type == BOOPSI_KIND ||
  1118.                            Node->Type == POPUP_KIND ||
  1119.                            Node->Type == TAB_KIND ||
  1120.                            Node->Type == LEVEL_KIND ||
  1121.                            Node->Type == TEXTEDIT_KIND)
  1122.                         {
  1123.                             Handle->BOOPSIPrevious = (Object *)Gadget;
  1124.  
  1125.                             if(!Handle->BOOPSIList)
  1126.                                 Handle->BOOPSIList = (Object *)Gadget;
  1127.                         }
  1128.                         else
  1129.                         {
  1130.                             if(Extra)
  1131.                                 Handle->Previous = Extra;
  1132.                             else
  1133.                                 Handle->Previous = Gadget;
  1134.                         }
  1135.                     }
  1136.                     #else
  1137.                     {
  1138.                         if(Extra)
  1139.                             Handle->Previous = Extra;
  1140.                         else
  1141.                             Handle->Previous = Gadget;
  1142.                     }
  1143.                     #endif    /* DO_BOOPSI_KIND */
  1144.                 }
  1145.                 else
  1146.                 {
  1147.                     Handle->Failed = TRUE;
  1148.  
  1149.                     return;    /* Note: must return since we are in a loop that
  1150.                              *       creates all gadgets for the current page.
  1151.                              */
  1152.                 }
  1153.             }
  1154.         }
  1155.     }
  1156. }
  1157.